// // 认识
// ***********************************  接口  *************************

// // 对象类型
// interface ObjType {
// 	// 必须属性
// 	name: string
// 	// 可选属性
// 	age?: number
// 	// 只读属性
// 	readonly sex: '男' | '女'
// 	// 其他属性
// 	[propsName: string]: any
// }

// function say(obj: ObjType) {
// 	console.log(obj.name);
// }

// say({ name: '张三', age: 123, sex: '男', like: '篮球' })
// say({ name: '李四', sex: '女', height: 180 })


// // 函数类型
// // 形式一
// const add: (a: number, b: number) => number = (a: number, b: number) => {
// 	return a + b
// }

// // 形式二
// interface Add1Type {
// 	(aaaaaa: string, bbbbbbb: number): string
// }

// const add1: Add1Type = (a: string, b: number) => {
// 	return a + b
// }


// const str: string = '123'


// // 数组类型
// interface ArrType {
// 	[propsName: number]: string
// }

// const arr1: ArrType = ['a', 'b', 'c', 'd']


// 类
// interface ClockInterface {
// 	currentTime: Date;
// }

// class Clock implements ClockInterface {
// 	currentTime: Date;
// 	constructor(h: number, m: number) { }
// }

// interface ClockInterface {
// 	currentTime: Date;
// 	setTime(d: Date): void;
// }

// class Clock implements ClockInterface {
// 	currentTime: Date = new Date();
// 	setTime(d: Date) {
// 		this.currentTime = d;
// 	}
// 	constructor(h: number, m: number) { }
// }
// type SexType = '男' | '女'


// interface PersonClass {
// 	// 描述 原型（实例）的属性和方法
// 	name: string
// 	age: number
// 	sex: SexType
// 	say(): void
// }


// class Person implements PersonClass {
// 	name: string
// 	age: number
// 	sex: SexType
// 	constructor(name: string, age: number, sex: SexType) {
// 		this.name = name
// 		this.age = age
// 		this.sex = sex
// 	}
// 	say() {
// 		console.log(`我是${this.name}, 今年${this.age}岁了, 性别${this.sex}`);

// 	}
// }


// const p1 = new Person('张三', 18, '男')

// p1.say()


// interface ClockConstructor {
// 	new (hour: number, minute: number);
// }

// class Clock implements ClockConstructor {
// 	constructor(h: number, m: number) { }
// }


// 类静态部分与实例部分的区别
// 限制 constructor
// interface ClockConstructor {
// 	new(hour: number): ClockInterface;
// }
// interface ClockInterface {
// 	tick(): void;
// }

// function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface {
// 	return new ctor(hour);
// }

// class DigitalClock implements ClockInterface {
// 	constructor(h: number) { }
// 	tick() {
// 		console.log("beep beep");
// 	}
// }
// class AnalogClock implements ClockInterface {
// 	constructor(h: number) { }
// 	tick() {
// 		console.log("tick tock");
// 	}
// }



// let digital = createClock(DigitalClock, 12, 17);
// let analog = createClock(AnalogClock, 7, 32);


// 继承接口

// interface NameType {
// 	name: string
// }
// interface AgeType extends NameType {
// 	age: number
// }

// interface SexType extends AgeType {
// 	sex: string
// }
// const obj: SexType = {
// 	age: 123,
// 	name: '123',
// 	sex: '123123'
// }